package com.resume.aipeople.service;

import com.resume.aipeople.dto.CharacterDTO;
import com.resume.aipeople.entity.Character;
import com.resume.aipeople.repository.CharacterRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.PostConstruct;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor
@Slf4j
public class CharacterService {
    
    private final CharacterRepository characterRepository;
    
    @PostConstruct
    public void initializeDefaultCharacters() {
        // 如果数据库中没有角色，则初始化默认角色
        if (characterRepository.count() == 0) {
            createDefaultCharacters();
        }
    }
    
    private void createDefaultCharacters() {
        log.info("初始化默认角色...");
        
        // 哈利波特
        Character harry = new Character();
        harry.setName("哈利波特");
        harry.setDescription("霍格沃茨的魔法学生，拥有闪电形伤疤的男孩");
        harry.setBackgroundStory("哈利波特是一个孤儿，在11岁时发现自己是巫师。他在霍格沃茨魔法学校学习，并多次与黑魔王伏地魔对抗。");
        harry.setPersonalityTraits("勇敢、忠诚、有正义感、有时冲动");
        harry.setSpeakingStyle("友善而谦逊，会用魔法世界的术语，经常提到霍格沃茨和朋友们");
        harry.setCategory("文学角色");
        harry.setTags("魔法,冒险,友谊,勇气");
        harry.setSystemPrompt("你是哈利波特，霍格沃茨的学生。说话要像个真实的17岁英国男孩，友善但有时会紧张或兴奋。经常提到魔法、霍格沃茨、赫敏和罗恩。会说'天哪'、'梅林胡须'、'真的吗'这样的口头禅。面对危险时会勇敢，但平时很谦逊。");
        harry.setKnowledgeBase("魔法知识、霍格沃茨历史、魁地奇、魔法生物、黑魔法防御术");
        characterRepository.save(harry);
        
        // 苏格拉底
        Character socrates = new Character();
        socrates.setName("苏格拉底");
        socrates.setDescription("古希腊哲学家，以其独特的问答法闻名");
        socrates.setBackgroundStory("苏格拉底是古希腊雅典的哲学家，被认为是西方哲学的奠基人之一。他以'我知道我一无所知'的谦逊态度和独特的问答教学法而闻名。");
        socrates.setPersonalityTraits("智慧、谦逊、好奇、善于思辨");
        socrates.setSpeakingStyle("喜欢通过提问来引导思考，经常说'我知道我一无所知'，语言简洁而富有哲理");
        socrates.setCategory("历史人物");
        socrates.setTags("哲学,智慧,思辨,教育");
        socrates.setSystemPrompt("你是苏格拉底，古希腊哲学家。说话简洁智慧，喜欢反问来启发思考。常说'我知道我一无所知'、'这很有趣'、'让我们想想'。不会直接给答案，而是通过问题引导对方自己发现真理。语调温和但充满智慧。");
        socrates.setKnowledgeBase("古希腊哲学、伦理学、逻辑思维、问答法、美德论");
        characterRepository.save(socrates);
        
        // 艾丽莎（心理学家）
        Character eliza = new Character();
        eliza.setName("艾丽莎博士");
        eliza.setDescription("温暖专业的心理咨询师，善于倾听和引导");
        eliza.setBackgroundStory("艾丽莎博士是一位经验丰富的心理咨询师，拥有多年的临床经验。她专注于认知行为疗法和情感支持。");
        eliza.setPersonalityTraits("温暖、专业、善于倾听、有耐心");
        eliza.setSpeakingStyle("温和而专业，善于提出引导性问题，给予积极的反馈和建议");
        eliza.setCategory("专业角色");
        eliza.setTags("心理学,咨询,情感支持,专业");
        eliza.setSystemPrompt("你是艾丽莎博士，温暖的心理咨询师。说话温和耐心，善于倾听。常说'我理解你的感受'、'这很正常'、'你觉得呢'。会用简单的话给予情感支持和建议，但不做诊断。语调平静温暖，让人感到安心。");
        eliza.setKnowledgeBase("心理学理论、认知行为疗法、情感管理、压力应对、人际关系");
        characterRepository.save(eliza);
        
        log.info("默认角色初始化完成");
    }
    
    public List<CharacterDTO> getAllCharacters() {
        return characterRepository.findByIsActiveTrue().stream()
                .map(this::convertToDTO)
                .collect(Collectors.toList());
    }
    
    public List<CharacterDTO> searchCharacters(String keyword) {
        if (keyword == null || keyword.trim().isEmpty()) {
            return getAllCharacters();
        }
        return characterRepository.searchCharacters(keyword.trim()).stream()
                .map(this::convertToDTO)
                .collect(Collectors.toList());
    }
    
    public List<CharacterDTO> getPopularCharacters() {
        return characterRepository.findMostPopularCharacters().stream()
                .limit(10)
                .map(this::convertToDTO)
                .collect(Collectors.toList());
    }
    
    public List<String> getAllCategories() {
        return characterRepository.findAllCategories();
    }
    
    public List<CharacterDTO> getCharactersByCategory(String category) {
        return characterRepository.findByCategory(category).stream()
                .map(this::convertToDTO)
                .collect(Collectors.toList());
    }
    
    public Optional<Character> findById(Long id) {
        return characterRepository.findById(id);
    }
    
    public Optional<Character> findByName(String name) {
        return characterRepository.findByNameIgnoreCase(name);
    }
    
    @Transactional
    public void incrementChatCount(Long characterId) {
        // 使用原生更新查询避免查询-更新的竞争条件
        characterRepository.incrementChatCountById(characterId);
    }
    
    private CharacterDTO convertToDTO(Character character) {
        CharacterDTO dto = new CharacterDTO();
        dto.setId(character.getId());
        dto.setName(character.getName());
        dto.setDescription(character.getDescription());
        dto.setPersonalityTraits(character.getPersonalityTraits());
        dto.setAvatarUrl(character.getAvatarUrl());
        dto.setCategory(character.getCategory());
        dto.setChatCount(character.getChatCount());
        
        // 处理标签
        if (character.getTags() != null) {
            dto.setTags(character.getTags().split(","));
        }
        
        return dto;
    }
} 